home *** CD-ROM | disk | FTP | other *** search
/ IBM OEM Software Product … CD For PC Manufacturers / IBM OEM Software - Product Sampler CD for PC Manufacturers.iso / InternetIntranets / Notes / INSTALL.DSK / INST.LSS < prev    next >
Text File  |  1997-08-18  |  44KB  |  1,046 lines

  1. ''/*********************************************************************
  2. ''
  3. ''   Module Name:   INST.lss
  4. ''
  5. ''   Module Code:   COMINST
  6. ''
  7. ''   Author:              
  8. ''
  9. ''   Creation Date:       Jan 26, 1994
  10. ''
  11. ''   Copyright Lotus Development Corporation, (c) 1994
  12. ''
  13. ''
  14. ''  
  15. ''   Description: 
  16. ''  
  17. ''
  18. ''   Additional authors:
  19. ''
  20. ''   Change History:
  21. ''   $Log:   //CIT/VOL1/CFLOG/logfiles/cominst/toolkit/inst___@.lss  $
  22. '' 
  23. ''    Rev 1.30.1.0   15 Nov 1995 17:05:18   mhishinu
  24. '' Merged GC5 into FE5
  25. '' 
  26. ''    Rev 1.30   11 Oct 1995 15:57:22   glutz
  27. '' AddIconINST sets working directory.
  28. '' 
  29. ''    Rev 1.29   26 Sep 1995 09:01:30   jdonohue
  30. '' Fixed preventing overwrite of cinstall.ini, .inf for language install
  31. '' 
  32. ''    Rev 1.28   25 Sep 1995 12:51:28   jdonohue
  33. '' Added placeholder function InitLanguageINST
  34. '' 
  35. ''    Rev 1.27   Sep 25 1995 09:52:24   cmoy
  36. '' Prevent overwrite of cinstall.ini, xxx.lss by supressing INSTTOP section inst
  37. '' ead of INSTFILES section
  38. '' 
  39. ''    Rev 1.26   07 Sep 1995 14:55:18   tveerapp
  40. '' Moved the setting of INSTDIR during a language server install from
  41. '' main.lss to fix spr# WED2SVNRDZ
  42. '' 
  43. ''    Rev 1.25   01 Sep 1995 09:35:18   jdonohue
  44. '' Turn off INSTLANG?? section for language install
  45. '' 
  46. ''    Rev 1.24   18 Aug 1995 16:43:12   glutz
  47. '' INITInst sets InitDir to SYM_PARENTDIR$.
  48. '' 
  49. ''    Rev 1.23   14 Aug 1995 13:41:46   jdonohue
  50. '' Added code to add language qualifier to node icon in AddIconsINST
  51. '' 
  52. ''    Rev 1.22   14 Aug 1995 09:09:26   jdonohue
  53. '' Added code to handle language install to server
  54. '' 
  55. ''    Rev 1.21   02 Aug 1995 14:56:28   amontalv
  56. '' Added name of product to node install shortcut.
  57. '' 
  58. ''    Rev 1.20   17 Jul 1995 15:53:58   amontalv
  59. '' Added code to put install in program folder for server install.
  60. '' 
  61. ''    Rev 1.19   03 May 1995 18:14:14   mzgripce
  62. '' replace #else with 'else
  63. '' 
  64. ''    Rev 1.18   02 May 1995 12:52:42   cmoy
  65. '' Merged c2 into cf build
  66. '' 
  67. ''    Rev 1.18   10 Apr 1995 18:09:14   amontalv
  68. '' Changed comments to reflect change of function reference.
  69. '' 
  70. ''    Rev 1.17   02 Feb 1995 14:27:06   cmoy
  71. '' 
  72. '' Thangaraj added fixes for Pipeline Problem
  73. '' 
  74. ''    Rev 1.16   13 Jan 1995 17:17:58   tveerapp
  75. '' 
  76. '' Removed redundant code
  77. '' 
  78. ''    Rev 1.15   12 Jan 1995 15:30:42   tveerapp
  79. '' 
  80. '' 1. changed cmoVital to cmoOverwrite for making the LAUNCHEXE entry in cinstall.ini
  81. '' 2. Removed MakePath.It cannot handle file names with paths in it. e.g. reg\foo.exe
  82. '' 
  83. ''    Rev 1.14   11 Jan 1995 15:32:08   tveerapp
  84. '' 
  85. '' Fixed spr# TVEN28TJK:
  86. '' The cinstall.ini in the temporary directory is used to determine if the product
  87. '' being installed supports pipeline(based on the existence of the LAUNCHEXE entry)
  88. '' If it does, a global flag is set to indicate this and an enrty is made in the
  89. '' cinstall.ini that is installed on the machine.
  90. '' If the flag is set and the execuatble exists, it is launched.
  91. '' 
  92. ''    Rev 1.13   29 Dec 1994 12:23:14   tveerapp
  93. '' 
  94. '' Fixed AND _.
  95. '' 
  96. ''    Rev 1.12   29 Dec 1994 12:15:28   tveerapp
  97. '' 
  98. '' Added a check for pipeline processing to be launched only for a non-automated 
  99. '' install.
  100. '' 
  101. ''    Rev 1.11   28 Dec 1994 16:13:50   tveerapp
  102. '' 
  103. '' Added pipeline processing (electronic registration). Functions PostCopyConfig
  104. '' and PostSuccessReg have these changes. Removed the callback for the elrctronic
  105. '' registration dialog.
  106. '' 
  107. ''    Rev 1.10   12 May 1994 11:20:52   mmeth
  108. '' Adding Icons for Lic and Install and using DoMsgBox instead of MessageBox
  109. '' 
  110. ''    Rev 1.9   02 May 1994 18:34:02   mzgripce
  111. '' 
  112. '' add AddIconsINST()
  113. '' 
  114. ''    Rev 1.8   04 Apr 1994 18:10:44   mmeth
  115. '' Now can ignore share.lss & shared.ini
  116. '' 
  117. ''    Rev 1.7   22 Mar 1994 12:34:16   mmeth
  118. '' added licdir & instdir to toolkit registration
  119. '' 
  120. ''    Rev 1.6   28 Feb 1994 14:27:42   mmeth
  121. '' Incorrectly reseting INSTDIR in PrecopyCOnfigINST
  122. '' 
  123. ''    Rev 1.5   18 Feb 1994 13:29:42   mmeth
  124. '' 
  125. '' Now check for Listlength of Reg_GetDirSymbolList
  126. '' 
  127. ''    Rev 1.4   17 Feb 1994 10:23:06   mmeth
  128. '' Added Reg_SetAllowUserToChoseInSMartSUite
  129. '' 
  130. ''    Rev 1.3   16 Feb 1994 11:00:22   mmeth
  131. '' Added error message if INSTTOP sec is
  132. '' 
  133. ''    Rev 1.2   15 Feb 1994 15:33:58   mmeth
  134. '' took out a print
  135. '' 
  136. ''    Rev 1.1   15 Feb 1994 14:48:30   mmeth
  137. '' fixed BASEDIR & Reg_GetDirSymbolLIst(1)
  138. '' 
  139. ''    Rev 1.0   11 Feb 1994 10:56:44   jbrodeur
  140. '' Initial Revision
  141. ''----------------------------------------------------------------------
  142. ''   Date     Vers. Pgmr  SPR#  Change
  143. ''----------------------------------------------------------------------
  144. ''  2-08-94   0004  MMETH       moved checking first prod for change to Initcopylist
  145. ''  2-04-94   0003  MMETH       changed PreCopyConfig to work for SmartSuite
  146. ''  2-03-94   0002  MMETH       corrected 1 prod vs smartsuite
  147. ''  2-02-94   0001  MMETH       cinstall.ini install for standard and server
  148. ''  1-25-94   0000              Initial Check-In
  149. '' !
  150. ''
  151. ''----------------------------------------------------------------------
  152. ''
  153. ''*********************************************************************/
  154.  
  155. USE "TOOLKIT"
  156. USE "LANGUAGE"
  157. OPTION DECLARE
  158.  
  159.  
  160. '** These Are the Required Functions that Products must provide
  161. '***************************************************************
  162. DECLARE PUBLIC FUNCTION ProductRegINST (prodno%, network$, direction$) AS STRING
  163. DECLARE PUBLIC FUNCTION DefaultUserRegINST (prodno%, network$, direction$) AS STRING
  164. DECLARE PUBLIC FUNCTION InitINST (prodno%, network$, direction$, basedir$) AS STRING
  165. DECLARE PUBLIC FUNCTION PathChangeINST (prodno%, network$, direction$, destdirsym$, mainprodsonly%) AS STRING
  166. DECLARE PUBLIC FUNCTION InitCopyListINST (prodno%, network$, direction$) AS STRING
  167. DECLARE PUBLIC FUNCTION PreCopyConfigINST (prodno%, network$, direction$, lic%) AS STRING
  168. DECLARE PUBLIC FUNCTION AddTheBillBoardsINST (prodno%, network$, direction$, nbytes&) AS STRING
  169. DECLARE PUBLIC FUNCTION PostCopyConfigINST (prodno%, network$, direction$, programgroup$) AS STRING
  170. DECLARE PUBLIC FUNCTION AddIconsINST (prodno%, network$, direction$, programgroup$) AS STRING
  171. DECLARE PUBLIC FUNCTION UIINST (prodno%, network$, direction$) AS STRING
  172. DECLARE PUBLIC FUNCTION PostSuccessRegINST (prodno%, network$, direction$) AS STRING
  173. DECLARE PUBLIC FUNCTION InitLanguageINST (prodno%, network$, direction$) AS STRING
  174.  
  175. '** Product specific functions
  176. '*****************************
  177. DECLARE FUNCTION GetINSTPathfromLotusIni() AS STRING
  178.  
  179. ' ** Global flag for launching pipeline exe
  180. PUBLIC gProdsupport%
  181.  
  182. '*************************************************************************
  183. '**************************** Required Functions *************************
  184. '*************************************************************************
  185.  
  186. '*************************************************************************
  187. '** SUB Initialize
  188. '**
  189. '** Purpose: Initialize the INST product scripts. There is only one purpose
  190. '**          of this routine, it is to register **your product**. Without
  191. '**          this function, your product will not install.  All you
  192. '**          you need to do in this subroutine is:
  193. '**                   modify INST -> your acronmy.
  194. '**          NOTE: so as not to clutter up the INSTCUI.RC file,
  195. '**                we always use SID_INST.  You of course can be more
  196. '**                creative!
  197. '**
  198. '**          ASSUMPTIONS: Many things in the toolkit key off of your
  199. '**                       Acronym. These are the constraints:
  200. '**                     1. your top level chapther in the INF must
  201. '**                        have a KEYWORD of your Acronym +"TOP"
  202. '**                           e.g. INSTTOP
  203. '** Author:  Marcel Meth  
  204. '** Arguments: None
  205. '** Returns:   NONE
  206. '*************************************************************************
  207. SUB Initialize
  208.    Reg_RegisterProductNames "INST", LdString(SID_BLANKTEXT) 
  209. END SUB
  210.  
  211. '*************************************************************************
  212. '** FUNCTION ProductRegINST (prodno%, network$, direction$) AS INTEGER
  213. '**
  214. '** Purpose: This function allows your product to register itself
  215. '**          in the Install Product Registry.  The toolkit squirrles
  216. '**          the information provided and will provide you with
  217. '**          various features accordingly.  For example, if you support
  218. '**          shared files, the toolkit will do most of the work
  219. '**          for the LOTUSAPP directory.
  220. '**
  221. '**          For the most part you should use only Reg_Set... Functions.
  222. '**          
  223. '**
  224. '**          If you turn on ATM, LICENSING, or and SHARED tools, then
  225. '**          you must be sure to add the appropriate lines and files
  226. '**          in you INST.SCR and INST.LYT, respectively. See Cook book.
  227. '**
  228. '**          If you support server, you will have to make sure that
  229. '**          you have the correct entire for the install files in your
  230. '**          INST.SCR and INST.LYT
  231. '**
  232. '** Arguments:  All paremeters are **read only**. 
  233. '**          prodno%: This is your prodno%.  It is assigned to you by the
  234. '**                   toolkit in the order in which you were  registered.
  235. '**                   When your product is oart of Smart Suite, Smart Suite
  236. '**                   will always be product #1. (prodno% >=1)
  237. '**          network$: UNINITIALIZED
  238. '**          direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  239. '**                      then step backwards, i.e start at your last dialog
  240. '**                      first.
  241. '**     
  242. '** Errors:    No return code for errors, you must Raise them
  243. '** Author:    MMeth
  244. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  245. '**                             allow the user to step backwards.)
  246. '*************************************************************************
  247.  
  248. PUBLIC FUNCTION ProductRegINST (prodno%, network$, direction$) AS STRING
  249.    ProductRegINST = gNEXT
  250.  
  251.    Reg_SetSupportedInstallTypes prodno%, 1, 1, 1
  252.    'Reg_SetSelectedInstallType ProdNo%,TypeSelected$  
  253.    Reg_SetProdSizes prodno%, 524288, 524288 ' .5 meg.
  254.    Reg_SetUIInOrOut prodno%, 1  
  255.    Reg_SetShareFlags prodno%, 0, 0, 0, 0 
  256.  
  257.    Reg_SetAllowUserToPickInSuite prodno%, 0
  258.  
  259.    'NO NEED TO SET SINCE THER IS NO CD SUPPORT.
  260.    'Reg_SetCDOption prodno%,Inst%,CDOptStr$ 
  261.    'Reg_SetCDOptionSelected ProdNo%,Inst%,Selection% 
  262.  
  263.    'DEAL WITH LATER
  264.    'Reg_SetNodeOption ProdNo%,Inst%,NodeOptStr$  
  265.    'Reg_SetNodeOptionSelected ProdNo%,Inst%,Selection% 
  266.    Reg_SetSrvSupport prodno%, 1
  267.    Reg_SetLicenseSupport prodno%, 0
  268.    Reg_SetATMSupport prodno%, 0
  269.  
  270.    'Reg_SetProgManagerGroup prodno%, LdString(SID_INST)
  271.  
  272.  
  273. END FUNCTION
  274.  
  275. '*************************************************************************
  276. '** FUNCTION DefaultUserRegINST (prodno%, network$, direction$) AS STRING
  277. '**
  278. '** Purpose: **Only** the first registered product gets called.
  279. '**          For SMartSUite, this will be Smart Suite.
  280. '**          This functions allows you to set the default user reg.
  281. '**          information that the user will be shown. The toolkit
  282. '**          will provide default values from MS-Windows. If you disagree
  283. '**          with them you should modify them in this function using:
  284. '**          SetSymbolValue on SYM_NAME, SYM_COMPANY & SYM_SERIALNUM$
  285. '**          
  286. '**          It is upto you how you store registration information.
  287. '**          it will not be stored until later in PostCopyConfigINST.
  288. '**          The CIT provides functions that allow you to access .ri 
  289. '**          files: Lot_ReadDefaultsfromRi(ripath$).
  290. '**
  291. '**          If you need to write back to the floppy, do it here.
  292. '**          Most Lotus products will no longer write back to the floppy.
  293. '**          Remeber, you can't write back to a CD or network!
  294. '**
  295. '** In Symbols : SYM_NAME$, SYM_COMPANY$
  296. '** Out Symbols: SYM_NAME$, SYM_COMPANY$, SYM_SERIALNUM$
  297. '**            
  298. '** Arguments:  All paremeters are **read only**. 
  299. '**          prodno%: This is your prodno%.  It is assigned to you by the
  300. '**                   toolkit in the order in which you were  registered.
  301. '**                   When your product is oart of Smart Suite, Smart Suite
  302. '**                   will always be product #1. (prodno% >=1)
  303. '**          network$: UNINITIALIZED
  304. '**          network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  305. '**          direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  306. '**                      then step backwards
  307. '**     
  308. '**          direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  309. '**                      then step backwards, i.e start at your last dialog
  310. '**                      first.
  311. '**     
  312. '** Errors:    No return code for errors, you must Raise them
  313. '** Author:    MMeth
  314. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  315. '**                             allow the user to step backwards.)
  316. '*************************************************************************
  317.  
  318. PUBLIC FUNCTION DefaultUserRegINST (prodno%, network$, direction$) AS STRING
  319.  
  320.    DefaultUserRegINST = gNEXT
  321.  
  322. END FUNCTION
  323.  
  324.  
  325. '*************************************************************************
  326. '** FUNCTION InitINST (prodno%, network$, direction$, basedir$) AS STRING
  327. '**
  328. '** Purpose: This is the first time you will be called when
  329. '**          the server parmater us valid.  You need to use this
  330. '**          function to intialize certain things. (See the MUST DO
  331. '**          below).
  332. '**          
  333. '**          This is a good place to put up a dialog warning the user
  334. '**          of a prrevious version of your product. If there is a previous
  335. '**          version you might want to steer them twords or away from it.
  336. '**          
  337. '**
  338. '** Must Do: You **MUST** set inital values for all of the destination
  339. '** =======  directories that you refer to in your INF file.  If you do not,
  340. '**          then InitCopylist will fail!  e.g. SetSymbolValue "INSTDIR", basedir$
  341. '**          Of course you may be more intelligent.  You should preface your
  342. '**          directory with basedir$.  The toolkit is finding a good drive
  343. '**          letter and basedirectory.  Also, remeber all paths end in a
  344. '**          \ and are lower case.
  345. '**
  346. '**          You should **NOT** define LOTUSAPPDIR, NETLOTUSAPPDIR, WINDIR, &
  347. '**          WINSYSDIR. The toolkit does this for you.
  348. '**
  349. '**          Once you have defined destdir symbols, you need to register
  350. '**          them with the toolkit. (See the code below)
  351. '**
  352. '** In Symbols : 
  353. '** Out Symbols: 
  354. '**            
  355. '** Arguments:  All paremeters are **read only**. 
  356. '**          prodno%: This is your prodno%.  It is assigned to you by the
  357. '**                   toolkit in the order in which you were  registered.
  358. '**                   When your product is oart of Smart Suite, Smart Suite
  359. '**                   will always be product #1. (prodno% >=1)
  360. '**          network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  361. '**          direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  362. '**                      then step backwards
  363. '**     
  364. '**          direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  365. '**                      then step backwards, i.e start at your last dialog
  366. '**                      first.
  367. '**
  368. '**          basedir$:   The toolkit has found a good base. for your directory.
  369. '**                      This is it.  You should use it.  This will make Smart
  370. '**                      Suite work, and will pick a good drive letter for you.
  371. '**     
  372. '** Errors:    No return code for errors, you must Raise them
  373. '** Author:    MMeth
  374. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  375. '**                             allow the user to step backwards.)
  376. '**
  377. '*************************************************************************
  378.  
  379. PUBLIC FUNCTION InitINST (prodno%, network$, direction$, basedir$) AS STRING
  380. DIM dirSym$, sym$, symname$
  381.  
  382.    InitINST = direction$
  383.    '' In the backwards case, keep backing up
  384.    If direction$ = gBACK Then
  385.       EXIT FUNCTION
  386.    End If
  387.  
  388.    If network$ <> gSERVER AND network$ <> gSTANDARD AND network$ <> gDISTRIBUTION$ Then
  389.          Reg_SetUIInOrOut prodno%, FALSE
  390.    Else
  391.       '** Figure out where the first product is., put install there!
  392.       IF GetSymbolValue(SYM_SINGLESMARTSUITE$) = gSINGLE$ THEN
  393.          SetSymbolValue "INSTDIR", GetSymbolValue(SYM_PARENTDIR$)
  394.       Else
  395.          SetSymbolValue "INSTDIR", basedir$
  396.       End If
  397.  
  398.       sym$ = Reg_GetDirSymbolList(prodno%)
  399.       symname$ = sym$ + gNAME
  400.         
  401.       SetSymbolValue "INSTDIRNAME", " "
  402.  
  403.       SetListItem sym$, 1, "INSTDIR"
  404.       SetListItem symname$, 1, "INSTDIR" + gNAME$
  405.  
  406.    End If
  407.  
  408. END FUNCTION
  409.  
  410.  
  411. '*************************************************************************
  412. '** FUNCTION PathChangeINST (prodno%, network$, direction$, destdirsym$, mainprodsonly%) AS STRING
  413. '**
  414. '** Purpose: This function is called whenever the user proposes changes
  415. '**          to a path for your product.  by the time this function calls
  416. '**          you, the paths have already been checked syntactically, and
  417. '**          the directory has been checked to see that it is in fact writeable.
  418. '**          Your obligation is to verify that the proposed new path is okay with
  419. '**          you.  If, not, put up a dialog telling the user and return
  420. '**          gBACK.
  421. '**          
  422. '** In Symbols : 
  423. '** Out Symbols: 
  424. '**            
  425. '** Arguments:  All paremeters are **read only**. 
  426. '**          prodno%: This is your prodno%.  It is assigned to you by the
  427. '**                   toolkit in the order in which you were  registered.
  428. '**                   When your product is oart of Smart Suite, Smart Suite
  429. '**                   will always be product #1. (prodno% >=1)
  430. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  431. '**       direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  432. '**                      then step backwards
  433. '**      destdirsym$: The destdir symbol that has changed. e.g. "INSTDIR"
  434. '**   mainprodsonly%: (TRUE | FALSE) , when TRUE this means that only
  435. '**                   your top level product directory should change,
  436. '**                   probably "INSTDIR"
  437. '**     
  438. '** Errors:    No return code for errors, you must Raise them
  439. '** Author:    MMeth
  440. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  441. '**                             allow the user to step backwards.)
  442. '**
  443. '*************************************************************************
  444.  
  445. PUBLIC FUNCTION PathChangeINST (prodno%, network$, direction$, destdirsym$, mainprodsonly%) AS STRING
  446. DIM path$
  447.  
  448.    PathChangeINST = gNEXT
  449.  
  450.    path$ = GetSymbolValue (destdirsym$)
  451.    '' The following is a psudocode example
  452.    ''''''rc$ = DetectVersionPriorToDarwin(path$)
  453.    ''''''If rc$ = "BEAGLE" then
  454.    ''''''   ShowPathError SID_BEAGLE_FOUND, SID_ERR_EXISTBEAGLE, path$
  455.    ''''''   PathChangeINST = gBACK
  456.    ''''''end if   
  457.  
  458. END FUNCTION
  459.  
  460.  
  461. '*************************************************************************
  462. '** FUNCTION InitCopyListINST (prodno%, network$, direction$) AS STRING
  463. '**
  464. '** Purpose:  Product must Initialize the copylist
  465. '**          
  466. '** Must Do: You must initialize the copy list.  However,
  467. '** =======  if you leve the code totally untouched as is,
  468. '**          it will probably work for you.
  469. '**
  470. '** In Symbols : 
  471. '** Out Symbols: 
  472. '**            
  473. '** Arguments:  All paremeters are **read only**. 
  474. '**          prodno%: This is your prodno%.  It is assigned to you by the
  475. '**                   toolkit in the order in which you were  registered.
  476. '**                   When your product is oart of Smart Suite, Smart Suite
  477. '**                   will always be product #1. (prodno% >=1)
  478. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  479. '**       direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  480. '**                      then step backwards
  481. '**     
  482. '** Errors:    No return code for errors, you must Raise them
  483. '** Author:    MMeth
  484. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  485. '**                             allow the user to step backwards.)
  486. '**
  487. '*************************************************************************
  488.  
  489. PUBLIC FUNCTION InitCopyListINST (prodno%, network$, direction$) AS STRING
  490. DIM i%, sym$, chpt$
  491.  
  492.    InitCopyListINST = direction$
  493.    '' In the backwards case, keep backing up
  494.    If direction$ = gBACK Then
  495.       EXIT FUNCTION
  496.    End If
  497.  
  498.    sym$ = Reg_GetProductAcronym(prodno%) + gTOP$
  499.    chpt$ = Lot_GetChapterFromKeyWord(sym$)
  500.  
  501.    if chpt$ = "" then   
  502.       ErrorMsg 0, "Developers: You need to have install section with INSTTOP in INF file"
  503.       ERROR STFQUIT
  504.    end if
  505.  
  506.    SELECT CASE Reg_GetProdSelectedInstallType(prodno%)
  507.  
  508.    CASE gCOMPLETE$
  509.       i% = F_COMPLETE
  510.    CASE gLAPTOP$
  511.       i% = F_LAPTOP
  512.    CASE gCUSTOM$
  513.       i% = F_CUSTOM
  514.    END SELECT
  515.  
  516.    Lot_InitializeCopyList chpt$, i%
  517.  
  518.    '** FOR STANDARD we only want to install the cinstall.ini file
  519.    If network$ <> gSERVER$ Then
  520.       If FIsKeywordinCopyList ("INSTFILES") <> FALSE Then
  521.          chpt$ =  Lot_GetChapterFromKeyword("INSTFILES")
  522.          Lot_ToggleChapterFilesInCopyList chpt$              
  523.       End If
  524.    End If
  525.         
  526.     'For a language install, we don't overwrite the cinstall.ini and .INF files
  527.     'by turning off the INSTTOP section
  528.    IF network$ <> gSERVER$ THEN
  529.    IF GetSymbolValue(SYM_INSTALLKIND$) = gLANGUAGEINSTALL$ THEN
  530.         chpt$ =  Lot_GetChapterFromKeyword("INSTTOP")
  531.         Lot_SetChapterFilesInCopyListInOrOut chpt$, 0 
  532.     END IF
  533.    END iF
  534.  
  535. END FUNCTION
  536.  
  537. '*************************************************************************
  538. '** FUNCTION UIINST (prodno%, network$, direction$) AS STRING
  539. '**
  540. '** Purpose: This is your chance to put up any User Interface
  541. '**          that you want.  remeber, try to keep it short.
  542. '**          In Smart Suite, if every product puts up to extra
  543. '**          dialogs, then the Smart SUite will consist of 16 dialogs!
  544. '**          
  545. '**          Pay attention to the value of direction, if you are putting
  546. '**          up more than one dialog.
  547. '**
  548. '**          The toolkit will do an acurate space computation later,
  549. '**          so you can tamper with the copy list. But you shouldn't
  550. '**          write out anything to the disk until PostCopyCofig!
  551. '**   
  552. '** In Symbols : 
  553. '** Out Symbols: 
  554. '**            
  555. '** Arguments:  All paremeters are **read only**. 
  556. '**          prodno%: This is your prodno%.  It is assigned to you by the
  557. '**                   toolkit in the order in which you were  registered.
  558. '**                   When your product is oart of Smart Suite, Smart Suite
  559. '**                   will always be product #1. (prodno% >=1)
  560. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  561. '**       direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  562. '**                      then step backwards
  563. '**     
  564. '** Errors:    No return code for errors, you must Raise them
  565. '** Author:    MMeth
  566. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  567. '**                             allow the user to step backwards.)
  568. '**
  569. '*************************************************************************
  570.  
  571. PUBLIC FUNCTION UIINST (prodno%, network$, direction$) AS STRING
  572.    UIINST = direction$
  573.    '' In the backwards case, keep backing up
  574.    If direction$ = gBACK Then
  575.       EXIT FUNCTION
  576.    End If
  577.  
  578. END FUNCTION
  579.  
  580.  
  581. '*************************************************************************
  582. '** FUNCTION PreCopyConfigINST (prodno%, network$, direction$, lic%) AS STRING
  583. '**
  584. '** Purpose: This is the very last function called before the space is
  585. '**          acurately computed (to the last byte) and files are copied
  586. '**          by the toolkit.  If you have any last minute changes to
  587. '**          do, this is the time to do them.  example:
  588. '**          Test for monitor resolution, and turn on the chapter
  589. '**          in the copy list with the appropriate resoltuion.
  590. '**          
  591. '** In Symbols : 
  592. '** Out Symbols: 
  593. '**            
  594. '** Arguments:  All paremeters are **read only**. 
  595. '**          prodno%: This is your prodno%.  It is assigned to you by the
  596. '**                   toolkit in the order in which you were  registered.
  597. '**                   When your product is oart of Smart Suite, Smart Suite
  598. '**                   will always be product #1. (prodno% >=1)
  599. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  600. '**       direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  601. '**                      then step backwards
  602. '**             lic%: TRUE | FALSE; TRUE licensing is turned on else it is off
  603. '**     
  604. '** Errors:    No return code for errors, you must Raise them
  605. '** Author:    MMeth
  606. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  607. '**                             allow the user to step backwards.)
  608. '**
  609. '*************************************************************************
  610.  
  611. PUBLIC FUNCTION PreCopyConfigINST (prodno%, network$, direction$, lic%) AS STRING
  612. DIM dirSym$
  613.  
  614.    PreCopyConfigINST = gNEXT
  615.  
  616.    '* Just in case product 1 changed.
  617.    If GetSymbolValue (SYM_SINGLESMARTSUITE) =  gSINGLE$ Then
  618.       dirSym$ = Reg_GetDirSymbolList(1)
  619.       If GetListLength(dirSym$) >= 1 Then
  620.          dirSym$ = GetListItem(dirSym$, 1)
  621.       End If
  622.       SetSymbolValue "INSTDIR", GetSymbolValue(dirSym$)
  623.    Else
  624.       SetSymbolValue "INSTDIR", GetSymbolValue (SYM_BASEDIR$)
  625.    End If
  626.  
  627.    '** TV: We have to reset this symbol for language/server install 
  628.    IF GetSymbolValue(SYM_INSTALLKIND$) = gLANGUAGEINSTALL$  AND _
  629.       GetSymbolValue(SYM_NETWORK$) =gSERVER$ THEN 
  630.       SetLanguageSubdir  "INSTDIR", "INSTDIR"  
  631.    END IF
  632.  
  633.    Lot_RefreshDestination ("INSTDIR") 
  634.  
  635.     'Make sure LOTUSUSERDIR still is the same as COMPONENTSDIR
  636.     SetSymbolValue SYM_LOTUSUSERDIR$, GetSymbolValue(SYM_COMPONENTSDIR$)
  637.     IF GetSymbolValue(SYM_LOTUSUSERDIR$) <> "" THEN 
  638.         Lot_RefreshDestination (SYM_LOTUSUSERDIR$) 
  639.         END IF
  640.  
  641. END FUNCTION
  642.  
  643.  
  644. '*************************************************************************
  645. '** FUNCTION  AddTheBillBoardsINST (prodno%, network$, direction$, nbytes&)
  646. '**
  647. '** Purpose: This is where to add the billboards using the function:
  648. '**          AddToBillboardList. Use nbytes& as the last parameter to
  649. '**          the MS-SETUP function AddToBillboardList
  650. '**
  651. '** In Symbols : 
  652. '** Out Symbols: 
  653. '**            
  654. '** Arguments:  All paremeters are **read only**. 
  655. '**          prodno%: This is your prodno%.  It is assigned to you by the
  656. '**                   toolkit in the order in which you were  registered.
  657. '**                   When your product is oart of Smart Suite, Smart Suite
  658. '**                   will always be product #1. (prodno% >=1)
  659. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  660. '**       direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  661. '**                      then step backwards
  662. '**           nbytes: Determines the duration of billboard timing.
  663. '**     
  664. '** Errors:    No return code for errors, you must Raise them
  665. '** Author:    MMeth
  666. '** Returns:   return: gNEXT |  gBACK (If you are showing UI and you
  667. '**                             allow the user to step backwards.)
  668. '**
  669. '*************************************************************************
  670.  
  671. PUBLIC FUNCTION AddTheBillBoardsINST (prodno%, network$, direction$, nbytes&) AS STRING
  672.    AddTheBillBoardsINST = direction$
  673.    '' In the backwards case, keep backing up
  674.    If direction$ = gBACK Then
  675.       EXIT FUNCTION
  676.    End If
  677.  
  678.    'psudo code follows as an example
  679.    ''''If network$ <> gNODE$ Then
  680.    ''''   SetListItem "IDC_BMP", 1, STR$(IDD_BILLBD1_BMP)
  681.    ''''   AddToBillboardList GetSymbolValue(SYM_CUIDLL$), DB_BILLBD1, "_FNameOrgDlgProc@16", nbytes& 
  682. '      else
  683.    ''''   AddToBillboardList GetSymbolValue(SYM_CUIDLL$), DB_BILLBD1, "FNameOrgDlgProc", nbytes& 
  684.    ''''End If
  685.  
  686. END FUNCTION
  687.  
  688. '*************************************************************************
  689. '** FUNCTION PostCopyConfigINST (prodno%, network$, direction$, programgroup$) AS STRING
  690. '**
  691. '** Purpose: This is called just after file copy has completed.
  692. '**          This is your opportunity to do all the configuaration
  693. '**          you need.  This includes:
  694. '**          
  695. '**          1. Writing to all your ini files
  696. '**          2. Writeing to OLE Reg database
  697. '**          3. Writing to any other confi files you may support
  698. '**          4. Writing out user registration information
  699. '**          5. Add program manager icons of those features
  700. '**             thatwere installed.
  701. '**          6. Create any working directories.
  702. '**             A working directory is one that does not contain any
  703. '**             files, thus the toolkit did not create it for you.
  704. '**
  705. '**          NOTE: THERE are many subtlties in here if you are
  706. '**                dealing with node and CD installs.  In particular,
  707. '**                you must be ***very*** careful to understand where the
  708. '**                things are that you are pointing to.  They could
  709. '**                be on the node, server, or CD!  This, in combination
  710. '**                with the INF file for Server/Node is probably the trickiest
  711. '**                part of writing a quality install.  When configuring,
  712. '**                you must be careful to consider what happens if there is
  713. '**                a preexisting product on the machine, in the same location or
  714. '**                another one!  This is very very tricky.  What happens
  715. '**                if you had a full installation previously in location C:\FOO
  716. '**                and now the user is installing a minimum installation in loaction
  717. '**                D:\FOO. 
  718. '**
  719. '**                Each and every thing you do for configuartion needs very
  720. '**                careful thought.
  721. '**
  722. '**                WE support a function Lot_WhereIsFeature("FeatureID")
  723. '**                This currrently tells you the location of a feature
  724. '**                If the feature appears both in the SERVER.INF and the
  725. '**                NODE.INF referred to by the same Keyword ID.
  726. '**                We do not support CDs with this command yet, but we will at some
  727. '**                time.
  728. '**
  729. '**                Also look out for writing to a file when the directory
  730. '**                doesn't exist.  If the user deselected one of your
  731. '**                you options, your install may still be running,
  732. '**                but since there were no files to copy into the directory
  733. '**                 it wasn't created by the toolkit!
  734. '**
  735. '**                Finally, remember that configuration files generally
  736. '**                hold the state that the user has customized earlier.
  737. '**                Sometimes you don't want to overwrite these!
  738. '**                You will primarily use three MS-SETUP functions
  739. '**                in here: 
  740. '**                  1. CreateIniKeyValue  (writing to ini files)
  741. '**                  2. SetRegKeyValue     (writing to OLE reg DB)
  742. '**                  3. CreateProgmanItem  (writing to progman) 
  743. '**
  744. '**                CreateProgmanGroup &  ShowProgmanGroup are
  745. '**                done for you by the time you reach this
  746. '**                function.
  747. '**
  748. '**                You will not have to do any configuration of LOTUS SHARED
  749. '**                tools.  The toolkit will do this for you.
  750. '** In Symbols : 
  751. '** Out Symbols: 
  752. '**            
  753. '** Arguments:  All paremeters are **read only**. 
  754. '**          prodno%: This is your prodno%.  It is assigned to you by the
  755. '**                   toolkit in the order in which you were  registered.
  756. '**                   When your product is oart of Smart Suite, Smart Suite
  757. '**                   will always be product #1. (prodno% >=1)
  758. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  759. '**       direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  760. '**                      then step backwards
  761. '**    programgroup$: The name of the program group the user chose to
  762. '**                   install the program manager icons     
  763. '**
  764. '** Errors:    No return code for errors, you must Raise them
  765. '** Author:    MMeth
  766. '** Returns:   return: gNEXT 
  767. '**
  768. '*************************************************************************
  769.  
  770. PUBLIC FUNCTION PostCopyConfigINST (prodno%, network$, direction$, programgroup$) AS STRING
  771.    PostCopyConfigINST = direction$
  772.    '' In the backwards case, keep backing up
  773.    If direction$ = gBACK Then
  774.       EXIT FUNCTION
  775.    End If
  776.    
  777.  
  778. SKIPCONFIG:
  779.  
  780. END FUNCTION
  781.  
  782. '** PUBLIC FUNCTION AddIconsINST (prodno%, network$, direction$, programgroup$) AS STRING
  783. '** Purpose: This is called just after file copy has completed.
  784. '**          1. Add program manager icons of those features
  785. '**             thatwere installed.
  786. '**
  787. '**          NOTE: THERE are many subtlties in here if you are
  788. '**                dealing with node and CD installs.  In particular,
  789. '**                you must be ***very*** careful to understand where the
  790. '**                things are that you are pointing to.  They could
  791. '**                be on the node, server, or CD!  This, in combination
  792. '**                with the INF file for Server/Node is probably the trickiest
  793. '**                part of writing a quality install.  When configuring,
  794. '**                you must be careful to consider what happens if there is
  795. '**                a preexisting product on the machine, in the same location or
  796. '**                another one!  This is very very tricky.  What happens
  797. '**                if you had a full installation previously in location C:\FOO
  798. '**                and now the user is installing a minimum installation in loaction
  799. '**                D:\FOO. 
  800. '**
  801. '**                Each and every thing you do for configuartion needs very
  802. '**                careful thought.
  803. '**
  804. '**                WE support a function Lot_WhereIsFeature("FeatureID")
  805. '**                This currrently tells you the location of a feature
  806. '**                If the feature appears both in the SERVER.INF and the
  807. '**                NODE.INF referred to by the same Keyword ID.
  808. '**                We do not support CDs with this command yet, but we will at some
  809. '**                time.
  810. '**
  811. '**                Also look out for writing to a file when the directory
  812. '**                doesn't exist.  If the user deselected one of your
  813. '**                you options, your install may still be running,
  814. '**                but since there were no files to copy into the directory
  815. '**                 it wasn't created by the toolkit!
  816. '**
  817. '**                Finally, remember that configuration files generally
  818. '**                hold the state that the user has customized earlier.
  819. '**                Sometimes you don't want to overwrite these!
  820. '**                You will primarily use three MS-SETUP functions
  821. '**                in here: 
  822. '**                  1. CreateProgmanItem  (writing to progman) 
  823. '**
  824. '**                CreateProgmanGroup &  ShowProgmanGroup are
  825. '**                done for you by the time you reach this
  826. '**                function.
  827. '**
  828. '**                You will not have to do any configuration of LOTUS SHARED
  829. '**                tools.  The toolkit will do this for you.
  830. '**            
  831. '** Arguments:  All paremeters are **read only**. 
  832. '**          prodno%: This is your prodno%.  It is assigned to you by the
  833. '**                   toolkit in the order in which you were  registered.
  834. '**                   When your product is oart of Smart Suite, Smart Suite
  835. '**                   will always be product #1. (prodno% >=1)
  836. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  837. '**       direction$: gNEXT | gBACK (If gBACK, and you are showing UI)
  838. '**                      then step backwards
  839. '**    programgroup$: The name of the program group the user chose to
  840. '**                   install the program manager icons     
  841. '**
  842. '** Errors:    No return code for errors, you must Raise them
  843. '** Author:    MZ
  844. '** Returns:   return: gNEXT 
  845. '**
  846. '*************************************************************************
  847.  
  848. PUBLIC FUNCTION AddIconsINST (prodno%, network$, direction$, programgroup$) AS STRING
  849. DIM instdir$, notused%, Caption$
  850. DIM LanguageQualifier$, LanguageAcronym$
  851.    AddIconsINST = direction$
  852.    '' In the backwards case, keep backing up
  853.    If direction$ = gBACK Then
  854.       EXIT FUNCTION
  855.    End If
  856.  
  857.    If network$ = gSERVER Then
  858.       instdir$ = Lot_WhereIsFeature(prodno%, "INSTFILES", "install.exe")
  859.         Caption$ = Reg_GetProductName(1)+ LdString(SID_NOT_VIEWSTRING)
  860.         'Add language qualifier for secondary languages
  861.         IF GetSymbolValue(SYM_INSTALLKIND$) = gLANGUAGEINSTALL$ THEN 
  862.             LanguageAcronym$ = GetSymbolValue(SYM_INSTALL_LANGUAGE$) 
  863.             LanguageQualifier$ =  Lot_SetLanguageDirectory ( LanguageAcronym$ ) 
  864.             Caption$ = Caption$ + " " + LanguageQualifier$  
  865.         END IF
  866.       ASSERT instdir$ <> "", ""
  867.        If IsNewShell() THEN
  868.             notused%=Lot_AddLinkToFolder(prodno%, instdir$ + "install.exe", _
  869.                                     Caption$+".lnk", _
  870.                                     Caption$, "", instdir$)
  871.             Lot_RegisterObject "INSTFILES",UNIN_CLASS_SHORTCUT$, Lot_GetProgFolder(prodno%) + Caption$+".lnk"
  872.         Else    
  873.           CreateProgmanItem  programgroup$, Caption$, _
  874.                   instdir$ + "install.exe", ",,,," + instdir$, cmoOverwrite
  875.            Lot_RegisterObject "INSTFILES", UNIN_CLASS_ICON$, programgroup$ + "\" + Caption$
  876.         End If
  877.    End If
  878.  
  879.  
  880. END FUNCTION
  881.  
  882.  
  883.  
  884. '*************************************************************************
  885. '** FUNCTION PostSuccessRegINST (prodno%, network$, direction$) AS STRING
  886. '**
  887. '** Purpose: If you need to launch something after install runs
  888. '** In Symbols : 
  889. '** Out Symbols: 
  890. '**            
  891. '** Arguments:  All paremeters are **read only**. 
  892. '**          prodno%: This is your prodno%.  It is assigned to you by the
  893. '**                   toolkit in the order in which you were  registered.
  894. '**                   When your product is oart of Smart Suite, Smart Suite
  895. '**                   will always be product #1. (prodno% >=1)
  896. '**         network$: gSTANDARD | gSERVER | gNODE | gDISTRIBTUION
  897. '**       direction$: gNEXT 
  898. '**
  899. '** Errors:    No return code for errors, you must Raise them
  900. '** Author:    MMeth
  901. '** Returns:   return: gNEXT 
  902. '**
  903. '*************************************************************************
  904.  
  905. PUBLIC FUNCTION PostSuccessRegINST (prodno%, network$, direction$) AS STRING
  906.  
  907. DIM rc$, ExecError%, notused%, executable$, gInstallIniFile$, prodbaseDir$
  908. DIM distribution$, automation$
  909. DIM cwd$, TmpInstallIni$
  910.  
  911.     PostSuccessRegINST = direction$
  912.     '' In the backwards case, keep backing up
  913.     'If direction$ = gBACK Then
  914.     '   EXIT FUNCTION
  915.     'End If
  916.  
  917.     'Build the path to the installed cinstall.ini
  918.     prodbaseDir$ = Lot_GetInstallDir()
  919.     gInstallIniFile$ = MakePath(prodbaseDir$,gINSTALLINI$)
  920.  
  921.     '** the following is to identify if the product currently being installed supports
  922.     '** the electronic registration. It sets up a global flag to indicate this
  923.     '** and makes the LAUNCHEXE entry to the installed cinstall.ini
  924.  
  925.     cwd$ = GetSymbolValue(SYM_STF_CWDDIR$)
  926.     TmpInstallIni$ = MakePath(cwd$,gINSTALLINI$)
  927.     executable$ = GetIniKeyString(TmpInstallIni$, "TOOLKIT","LAUNCHEXE")    
  928.     IF executable$ <> "" THEN
  929.         gProdsupport% = 1
  930.         '** make the exe entry
  931.         network$ = GetSymbolValue(SYM_NETWORK$)
  932.         IF network$ = gSERVER THEN
  933.             CreateIniKeyValue gInstallIniFile$, "TOOLKIT", "LAUNCHEXE", "", cmoOverwrite    
  934.         ELSE
  935.             CreateIniKeyValue gInstallIniFile$, "TOOLKIT", "LAUNCHEXE", gNotesInstallType$, cmoOverwrite    
  936.         END IF
  937.     ELSE
  938.         '** The current product that is being installed does not support pipeline
  939.         gProdsupport% = 0        
  940.     END IF
  941.  
  942.  
  943. '** the following is to identify subsequent installs from a distribution install
  944. '** to avoid launching the electronic registration. It makes an entry for
  945. '** a distribution install
  946.  
  947.  
  948.  
  949.     network$ = GetSymbolValue(SYM_NETWORK$)
  950.     automation$ = GetSymbolValue(SYM_AUTOMATIONINST$)
  951.     distribution$ = GetIniKeyString(gInstallIniFile$, "TOOLKIT", "DISTRIBUTION")
  952.     IF network$ <> gNODE$    AND _
  953.         distribution$ = ""    AND _
  954.         automation$ <> gTRUE$ THEN
  955.  
  956.         '** Notes modifies cinstall.ini to include the entire launch string, so we don't want to add the prodbase
  957.         '** and we also don't want to find out if the file exists since we already did this.
  958.  
  959.         executable$ = GetIniKeyString(gInstallIniFile$, "TOOLKIT","LAUNCHEXE")    
  960.         IF executable$ <> "" THEN
  961.  
  962.             '*** The check below is because MakePath only works with
  963.             '** a file name of 12 characters .e.g. foo.exe  and not reg\foo.exe
  964. '** Commentd out for NOTES !! (MAC 08-18-97)
  965. '**            IF RIGHT$(prodbaseDir$, 1) <> "\" THEN
  966. '**                prodbaseDir$ = prodbaseDir$ + "\"
  967. '**            END IF
  968. '**            executable$ = prodbaseDir$ + executable$
  969. '**            IF DoesFileExist(executable$,femExists) <> 0 AND gProdsupport% = 1 THEN
  970.  
  971.                 ExecError% = WinExec(executable$,SW_SHOWNORMAL)
  972.                 IF ExecError% < 32 THEN
  973.                     ErrorMsg SID_ERR_EXECPIPELINE, executable$
  974.                 END IF
  975. '**            END IF
  976.         END IF
  977.     END IF
  978.  
  979.     '** Record the language of install
  980.     CreateIniKeyValue gInstallIniFile$, "TOOLKIT", "LANGUAGE",_
  981.         GetSymbolValue(SYM_INSTALL_LANGUAGE$), cmoOverwrite
  982.      
  983.     IF network$ = gDISTRIBUTION$ THEN
  984.         CreateIniKeyValue gInstallIniFile$, "TOOLKIT", "DISTRIBUTION", "YES", cmoVital    
  985.     END IF
  986.         
  987. END FUNCTION
  988.  
  989.  
  990. '********************************
  991. '********************************
  992. '** Product Specific Functions **
  993. '********************************
  994. '********************************
  995.  
  996. '*************************************************************************
  997. '** FUNCTION GetINSTPathfromLotusIni() AS STRING
  998. '**
  999. '** Purpose: Gets the product dir path from Lotus.ini file, and searches for
  1000. '**          inst.exe in the dir. 
  1001. '**            
  1002. '** Author:    JYOTI KEDIA
  1003. '** Arguments: None
  1004. '** Returns:   if inst.exe does not exist in dir specified in lotus.ini, it
  1005. '**            returns "", otherwise returns the full path to the product.
  1006. '*************************************************************************
  1007.  
  1008. FUNCTION GetINSTPathfromLotusIni() AS STRING
  1009. DIM DestDir$, lotusinipath$, defdir$, temp%, ProdDir$, fullpath$, rv%
  1010.  
  1011.    DestDir$ = GetWindowsDir()
  1012.    lotusinipath$ = DestDir$ +"lotus.ini"
  1013.  
  1014.    if DoesFileExist(lotusinipath$,femExists) then
  1015.       defdir$ = GetIniKeyString(lotusinipath$,"Lotus Applications", "inst")
  1016.       if defdir$ <> "" then
  1017.          temp% = INSTR(1,LCASE$(defdir$),"inst.exe")
  1018.          if temp% <> 0 then
  1019.             ProdDir$ = MID$(defdir$,1,(temp%-1))
  1020.             if ProdDir$ <> "" then
  1021.                fullpath$ = ProdDir$ + "inst.exe"
  1022.                if DoesFileExist(fullpath$, femExists) then
  1023.                   rv% = Lot_CleanPath(fullpath$)
  1024.                   GetINSTPathfromLotusIni = fullpath$
  1025.                   EXIT FUNCTION
  1026.                end if 
  1027.             end if 
  1028.          end if 
  1029.       end if 
  1030.    end if
  1031.  
  1032.    GetINSTPathfromLotusIni = ""
  1033.  
  1034. END FUNCTION
  1035.  
  1036. '*************************************************************************
  1037. '** PUBLIC FUNCTION InitLanguageINST (prodno%, network$, direction$)
  1038. '** Purpose: Placeholder, since all products must provide a function of this
  1039. '** name, does nothing.
  1040. '*************************************************************************
  1041. PUBLIC FUNCTION InitLanguageINST (prodno%, network$, direction$) AS STRING
  1042.    InitLanguages "", "", prodno%    
  1043.     InitLanguageINST  = ""
  1044. END FUNCTION
  1045.  
  1046.